#include <agz/tracer/core/texture2d.h>

#include "./normalized_diffusion.h"

AGZ_TRACER_BEGIN

namespace
{

    const real INV_CDF_TAB[] =
    {
        real( 0.00000000000000000000), real( 0.00097735789316160467), real( 0.00195535291663178094), real( 0.00293398579755859605), real( 0.00391325726424256257), real( 0.00489316804613837593),
        real( 0.00587371887385810653), real( 0.00685491047917232473), real( 0.00783674359501258105), real( 0.00881921895547564498), real( 0.00980233729582288826), real( 0.01078609935248473276),
        real( 0.01177050586306294978), real( 0.01275555756633154660), real( 0.01374125520223973100), real( 0.01472759951191593940), real( 0.01571459123766811780), real( 0.01670223112298619209),
        real( 0.01769051991254639092), real( 0.01867945835221149209), real( 0.01966904718903442900), real( 0.02065928717125949457), real( 0.02165017904832728865), real( 0.02264172357087342394),
        real( 0.02363392149073489240), real( 0.02462677356094869138), real( 0.02562028053575736777), real( 0.02661444317061035028), real( 0.02760926222216492087), real( 0.02860473844829165141),
        real( 0.02960087260807411566), real( 0.03059766546181234836), real( 0.03159511777102618629), real( 0.03259323029845659359), real( 0.03359200380806830200), real( 0.03459143906505239563),
        real( 0.03559153683582976652), real( 0.03659229788805161421), real( 0.03759372299060430994), real( 0.03859581291360941052), real( 0.03959856842842832819), real( 0.04060199030766378087),
        real( 0.04160607932516231094), real( 0.04261083625601730374), real( 0.04361626187657126341), real( 0.04462235696441822080), real( 0.04562912229840596079), real( 0.04663655865864022032),
        real( 0.04764466682648495210), real( 0.04865344758456680713), real( 0.04966290171677609916), real( 0.05067303000827105136), real( 0.05168383324547900365), real( 0.05269531221609996541),
        real( 0.05370746770910898166), real( 0.05472030051475743062), real( 0.05573381142457855403), real( 0.05674800123138629138), real( 0.05776287072928191352), real( 0.05877842071365335652),
        real( 0.05979465198118029401), real( 0.06081156532983406776), real( 0.06182916155888352333), real( 0.06284744146889587046), real( 0.06386640586173933376), real( 0.06488605554058524127),
        real( 0.06590639130991296502), real( 0.06692741397551078830), real( 0.06794912434447852867), real( 0.06897152322523136814), real( 0.06999461142750154630), real( 0.07101838976234159384),
        real( 0.07204285904212766323), real( 0.07306802008055943154), real( 0.07409387369266713652), real( 0.07512042069481132678), real( 0.07614766190468634510), real( 0.07717559814132290974),
        real( 0.07820423022509183364), real( 0.07923355897770559264), real( 0.08026358522222079572), real( 0.08129430978304358346), real( 0.08232573348592896190), real( 0.08335785715798664508),
        real( 0.08439068162768137427), real( 0.08542420772483652613), real( 0.08645843628063926145), real( 0.08749336812763866544), real( 0.08852900409975296425), real( 0.08956534503227044086),
        real( 0.09060239176185160004), real( 0.09164014512653398392), real( 0.09267860596573386511), real( 0.09371777512024798140), real( 0.09475765343225898973), real( 0.09579824174533674297),
        real( 0.09683954090444070462), real( 0.09788155175592483381), real( 0.09892427514753752982), real( 0.09996771192842827947), real( 0.10101186294914678288), real( 0.10205672906164904579),
        real( 0.10310231111929814285), real( 0.10414860997686779809), real( 0.10519562649054572945), real( 0.10624336151793735417), real( 0.10729181591806602469), real( 0.10834099055137934309),
        real( 0.10939088627974913326), real( 0.11044150396647670065), real( 0.11149284447629527472), real( 0.11254490867537170207), real( 0.11359769743131105380), real( 0.11465121161315942888),
        real( 0.11570545209140571663), real( 0.11676041973798646778), real( 0.11781611542628657452), real( 0.11887254003114611223), real( 0.11992969442885857700), real( 0.12098757949717810212),
        real( 0.12204619611531943024), real( 0.12310554516396376989), real( 0.12416562752525954483), real( 0.12522644408282745943), real( 0.12628799572176066524), real( 0.12735028332863188028),
        real( 0.12841330779149379149), real( 0.12947706999988248255), real( 0.13054157084482076456), real( 0.13160681121882253364), real( 0.13267279201589327053), real( 0.13373951413153623013),
        real( 0.13480697846275380147), real( 0.13587518590805050533), real( 0.13694413736743721310), real( 0.13801383374243372804), real( 0.13908427593607267103), real( 0.14015546485290070189),
        real( 0.14122740139898445899), real( 0.14230008648191269649), real( 0.14337352101079836597), real( 0.14444770589628280755), real( 0.14552264205054041279), real( 0.14659833038727848598),
        real( 0.14767477182174409966), real( 0.14875196727072470537), real( 0.14982991765255410099), real( 0.15090862388711195896), real( 0.15198808689583062637), real( 0.15306830760169704009),
        real( 0.15414928692925547460), real( 0.15523102580461209388), real( 0.15631352515543750492), real( 0.15739678591097039373), real( 0.15848080900202027310), real( 0.15956559536097181251),
        real( 0.16065114592178800224), real( 0.16173746162001287341), real( 0.16282454339277460664), real( 0.16391239217879138845), real( 0.16500100891837057859), real( 0.16609039455341742531),
        real( 0.16718055002743337223), real( 0.16827147628552244218), real( 0.16936317427439451233), real( 0.17045564494236786768), real( 0.17154888923937272605), real( 0.17264290811695534589),
        real( 0.17373770252828169003), real( 0.17483327342813911875), real( 0.17592962177294213522), real( 0.17702674852073493894), real( 0.17812465463119442344), real( 0.17922334106563456158),
        real( 0.18032280878700973625), real( 0.18142305875991751596), real( 0.18252409195060306790), real( 0.18362590932696276624), real( 0.18472851185854707867), real( 0.18583190051656461872),
        real( 0.18693607627388589276), real( 0.18804104010504621436), real( 0.18914679298624978432), real( 0.19025333589537385404), real( 0.19136066981197075165), real( 0.19246879571727315561),
        real( 0.19357771459419753635), real( 0.19468742742734621021), real( 0.19579793520301322363), real( 0.19690923890918610173), real( 0.19802133953555114965), real( 0.19913423807349600603),
        real( 0.20024793551611386189), real( 0.20136243285820698556), real( 0.20247773109629035870), real( 0.20359383122859564530), real( 0.20471073425507516075), real( 0.20582844117740464740),
        real( 0.20694695299898871466), real( 0.20806627072496172715), real( 0.20918639536219632569), real( 0.21030732791930137338), real( 0.21142906940663028226), real( 0.21255162083628290071),
        real( 0.21367498322211042616), real( 0.21479915757971695944), real( 0.21592414492646649915), real( 0.21704994628148416291), real( 0.21817656266566373691), real( 0.21930399510166223576),
        real( 0.22043224461391636160), real( 0.22156131222863878483), real( 0.22269119897382461115), real( 0.22382190587925304692), real( 0.22495343397649295025), real( 0.22608578429890716088),
        real( 0.22721895788165549779), real( 0.22835295576169842291), real( 0.22948777897780217594), real( 0.23062342857054249357), real( 0.23175990558230696870), real( 0.23289721105730207262),
        real( 0.23403534604155418197), real( 0.23517431158291460247), real( 0.23631410873106534209), real( 0.23745473853752055438), real( 0.23859620205563170092), real( 0.23973850034059174252),
        real( 0.24088163444943930247), real( 0.24202560544106246909), real( 0.24317041437620262601), real( 0.24431606231745897628), real( 0.24546255032929295559), real( 0.24660987947803103548),
        real( 0.24775805083187099620), real( 0.24890706546088420259), real( 0.25005692443702026706), real( 0.25120762883411112965), real( 0.25235917972787685892), real( 0.25351157819592740061),
        real( 0.25466482531776790665), real( 0.25581892217480273199), real( 0.25697386985034020856), real( 0.25812966942959736372), real( 0.25928632199970158556), real( 0.26044382864969795044),
        real( 0.26160219047055099928), real( 0.26276140855515167649), real( 0.26392148399831888428), real( 0.26508241789680558886), real( 0.26624421134930298383), real( 0.26740686545644376526),
        real( 0.26857038132080718329), real( 0.26973476004692409358), real( 0.27090000274127984392), real( 0.27206611051232004739), real( 0.27323308447045324687), real( 0.27440092572805779847),
        real( 0.27556963539948459152), real( 0.27673921460106060133), real( 0.27790966445109549499), real( 0.27908098606988585022), real( 0.28025318057971743135), real( 0.28142624910487112899),
        real( 0.28260019277162884421), real( 0.28377501270827554247), real( 0.28495071004510447166), real( 0.28612728591442321280), real( 0.28730474145055534541), real( 0.28848307778984871863),
        real( 0.28966229607067595087), real( 0.29084239743344236784), real( 0.29202338302058861164), real( 0.29320525397659652489), real( 0.29438801144799170428), real( 0.29557165658335093905),
        real( 0.29675619053330448693), real( 0.29794161445054273551), real( 0.29912792948981931085), real( 0.30031513680795507426), real( 0.30150323756384567186), real( 0.30269223291846375501),
        real( 0.30388212403486458690), real( 0.30507291207819081658), real( 0.30626459821567653119), real( 0.30745718361665319573), real( 0.30865066945255337227), real( 0.30984505689691604902),
        real( 0.31104034712539141427), real( 0.31223654131574540838), real( 0.31343364064786438661), real( 0.31463164630376005970), real( 0.31583055946757626620), real( 0.31703038132558925000),
        real( 0.31823111306621765237), real( 0.31943275588002401078), real( 0.32063531095972097607), real( 0.32183877950017675262), real( 0.32304316269841776288), real( 0.32424846175363586376),
        real( 0.32545467786719256553), real( 0.32666181224262502703), real( 0.32786986608564783197), real( 0.32907884060416164873), real( 0.33028873700825600590), real( 0.33149955651021600911),
        real( 0.33271130032452500558), real( 0.33392396966787196710), real( 0.33513756575915598646), real( 0.33635208981948983009), real( 0.33756754307220682154), real( 0.33878392674286561537),
        real( 0.34000124205925469356), real( 0.34121949025139719502), real( 0.34243867255155863161), real( 0.34365879019424816487), real( 0.34487984441622637766), real( 0.34610183645650943740),
        real( 0.34732476755637614607), real( 0.34854863895937077123), real( 0.34977345191130854163), real( 0.35099920766028269714), real( 0.35222590745666843004), real( 0.35345355255312843612),
        real( 0.35468214420461674496), real( 0.35591168366838810133), real( 0.35714217220399863129), real( 0.35837361107331411336), real( 0.35960600154051325372), real( 0.36083934487209656794),
        real( 0.36207364233688660304), real( 0.36330889520603842913), real( 0.36454510475304158224), real( 0.36578227225372661469), real( 0.36702039898627203396), real( 0.36825948623120646763),
        real( 0.36949953527141754517), real( 0.37074054739215489551), real( 0.37198252388103747457), real( 0.37322546602805756200), real( 0.37446937512558703398), real( 0.37571425246838441314),
        real( 0.37696009935359681142), real( 0.37820691708076814574), real( 0.37945470695184552179), real( 0.38070347027118212058), real( 0.38195320834554519207), real( 0.38320392248412016301),
        real( 0.38445561399851718720), real( 0.38570828420277719628), real( 0.38696193441337578545), real( 0.38821656594923076300), real( 0.38947218013170709083), real( 0.39072877828462371230),
        real( 0.39198636173425677187), real( 0.39324493180934877445), real( 0.39450448984111080586), real( 0.39576503716323158111), real( 0.39702657511188194084), real( 0.39828910502571884811),
        real( 0.39955262824589554693), real( 0.40081714611606311660), real( 0.40208265998237835426), real( 0.40334917119351149095), real( 0.40461668110064674675), real( 0.40588519105749498728),
        real( 0.40715470242029427883), real( 0.40842521654781904772), real( 0.40969673480138452115), real( 0.41096925854485394369), real( 0.41224278914464285162), real( 0.41351732796972723305),
        real( 0.41479287639164752477), real( 0.41606943578451754950), real( 0.41734700752502618126), real( 0.41862559299244855859), real( 0.41990519356864858258), real( 0.42118581063808613330),
        real( 0.42246744558782395318), real( 0.42375009980753330918), real( 0.42503377468949921081), real( 0.42631847162862884781), real( 0.42760419202245592007), real( 0.42889093727114768750),
        real( 0.43017870877751135383), real( 0.43146750794699961773), real( 0.43275733618771777822), real( 0.43404819491043034052), real( 0.43534008552856567897), real( 0.43663300945822558496),
        real( 0.43792696811818748737), real( 0.43922196292991466660), real( 0.44051799531756014039), real( 0.44181506670797465741), real( 0.44311317853071213735), real( 0.44441233221803655429),
        real( 0.44571252920492915317), real( 0.44701377092909355682), real( 0.44831605883096320442), real( 0.44961939435370795737), real( 0.45092377894324114918), real( 0.45222921404822391533),
        real( 0.45353570112007474124), real( 0.45484324161297479128), real( 0.45615183698387412603), real( 0.45746148869249853020), real( 0.45877219820135750616), real( 0.46008396697574932555),
        real( 0.46139679648376880072), real( 0.46271068819631305802), real( 0.46402564358709014192), real( 0.46534166413262378903), real( 0.46665875131226042249), real( 0.46797690660817864439),
        real( 0.46929613150539256639), real( 0.47061642749176069156), real( 0.47193779605799301979), real( 0.47326023869765565522), real( 0.47458375690718140882), real( 0.47590835218587318467),
        real( 0.47723402603591347226), real( 0.47856077996237034178), real( 0.47988861547320421641), real( 0.48121753407927536639), real( 0.48254753729435084786), real( 0.48387862663511238548),
        real( 0.48521080362116109086), real( 0.48654406977502745457), real( 0.48787842662217778544), real( 0.48921387569101859594), real( 0.49055041851290864807), real( 0.49188805662216178449),
        real( 0.49322679155605680945), real( 0.49456662485484353953), real( 0.49590755806175063070), real( 0.49724959272299246171), real( 0.49859273038777729425), real( 0.49993697260831310158),
        real( 0.50128232093981617279), real( 0.50262877694051821820), real( 0.50397634217167441850), real( 0.50532501819756903139), real( 0.50667480658552432882), real( 0.50802570890590825758),
        real( 0.50937772673214110064), real( 0.51073086164070324866), real( 0.51208511521114230547), real( 0.51344048902608219187), real( 0.51479698467122925187), real( 0.51615460373537991323),
        real( 0.51751334781042990230), real( 0.51887321849137868490), real( 0.52023421737634134576), real( 0.52159634606655325140), real( 0.52295960616637848783), real( 0.52432399928331818728),
        real( 0.52568952702801730048), real( 0.52705619101427392259), real( 0.52842399285904595452), real( 0.52979293418245843039), real( 0.53116301660781295446), real( 0.53253424176159502856),
        real( 0.53390661127348093551), real( 0.53528012677634673189), real( 0.53665478990627657474), real( 0.53803060230256949392), real( 0.53940756560774805184), real( 0.54078568146756678114),
        real( 0.54216495153102006732), real( 0.54354537745034836593), real( 0.54492696088104997099), real( 0.54630970348188567787), real( 0.54769360691489055171), real( 0.54907867284537625885),
        real( 0.55046490294194605486), real( 0.55185229887649989156), real( 0.55324086232424052323), real( 0.55463059496368605217), real( 0.55602149847667559079), real( 0.55741357454837803242),
        real( 0.55880682486730082204), real( 0.56020125112529772782), real( 0.56159685501757850012), real( 0.56299363824271531076), real( 0.56439160250265374419), real( 0.56579074950271834865),
        real( 0.56719108095162418248), real( 0.56859259856148280932), real( 0.56999530404781317827), real( 0.57139919912954695302), real( 0.57280428552904216755), real( 0.57421056497208622371),
        real( 0.57561803918790876988), real( 0.57702670990918769611), real( 0.57843657887206090251), real( 0.57984764781613140627), real( 0.58125991848447855492), real( 0.58267339262366701913),
        real( 0.58408807198375378711), real( 0.58550395831829826765), real( 0.58692105338437139395), real( 0.58833935894256428334), real( 0.58975887675699589785), real( 0.59117960859532492357),
        real( 0.59260155622875620995), real( 0.59402472143205009569), real( 0.59544910598353240072), real( 0.59687471166510386311), real( 0.59830154026224791064), real( 0.59972959356404031972),
        real( 0.60115887336315820821), real( 0.60258938145589069357), real( 0.60402111964214599826), real( 0.60545408972546177484), real( 0.60688829351301443182), real( 0.60832373281562923673),
        real( 0.60976040944778642228), real( 0.61119832522763561933), real( 0.61263748197700063081), real( 0.61407788152139197724), real( 0.61551952569001466831), real( 0.61696241631577819486),
        real( 0.61840655523530563276), real( 0.61985194428894485608), real( 0.62129858532077542055), real( 0.62274648017862055394), real( 0.62419563071405670396), real( 0.62564603878242042168),
        real( 0.62709770624282179519), real( 0.62855063495815211017), real( 0.63000482679509350881), real( 0.63146028362412953694), real( 0.63291700731955413683), real( 0.63437499975948397068),
        real( 0.63583426282586374967), real( 0.63729479840448177708), real( 0.63875660838497372307), real( 0.64021969466083894496), real( 0.64168405912944581626), real( 0.64314970369204338407),
        real( 0.64461663025377136105), real( 0.64608484072367167173), real( 0.64755433701469555796), real( 0.64902512104371645751), real( 0.65049719473153932991), real( 0.65197056000291009337),
        real( 0.65344521878652761515), real( 0.65492117301505192728), real( 0.65639842462511621690), real( 0.65787697555733759547), real( 0.65935682775632420416), real( 0.66083798317069086803),
        real( 0.66232044375306464712), real( 0.66380421146009838118), real( 0.66528928825248034862), real( 0.66677567609494403644), real( 0.66826337695628068580), real( 0.66975239280934750763),
        real( 0.67124272563108078327), real( 0.67273437740250485728), real( 0.67422735010874301764), real( 0.67572164573903004126), real( 0.67721726628671985448), real( 0.67871421374929996606),
        real( 0.68021249012839912762), real( 0.68171209742980165558), real( 0.68321303766345431452), real( 0.68471531284348141622), real( 0.68621892498819214712), real( 0.68772387612009466817),
        real( 0.68923016826590555173), real( 0.69073780345656254909), real( 0.69224678372723114084), real( 0.69375711111732329961), real( 0.69526878767050148689), real( 0.69678181543469552839),
        real( 0.69829619646210927542), real( 0.69981193280923448263), real( 0.70132902653686401973), real( 0.70284747971009875478), real( 0.70436729439836165412), real( 0.70588847267541077191),
        real( 0.70741101661934779887), real( 0.70893492831263060783), real( 0.71046020984208568816), real( 0.71198686329892002522), real( 0.71351489077873031519), real( 0.71504429438151850817),
        real( 0.71657507621170024592), real( 0.71810723837811796244), real( 0.71964078299405342953), real( 0.72117571217723930310), real( 0.72271202804986833801), real( 0.72424973273861048551),
        real( 0.72578882837462188604), real( 0.72732931709355530536), real( 0.72887120103557478945), real( 0.73041448234536909823), real( 0.73195916317215869995), real( 0.73350524566971364582),
        real( 0.73505273199636245174), real( 0.73660162431500475488), real( 0.73815192479312474738), real( 0.73970363560280338877), real( 0.74125675892072884210), real( 0.74281129692821235011),
        real( 0.74436725181119756112), real( 0.74592462576029761046), real( 0.74748342097071673873), real( 0.74904363964239761842), real( 0.75060528397994508154), real( 0.75216835619266020352),
        real( 0.75373285849455384788), real( 0.75529879310435932283), real( 0.75686616224554481569), real( 0.75843496814632704872), real( 0.76000521303968271436), real( 0.76157689916336368530),
        real( 0.76315002875990822773), real( 0.76472460407665443505), real( 0.76630062736575210725), real( 0.76787810088417995935), real( 0.76945702689375528038), real( 0.77103740766114559069),
        real( 0.77261924545788673857), real( 0.77420254256039244822), real( 0.77578730124997086204), real( 0.77737352381283419955), real( 0.77896121254011374546), real( 0.78055036972787505967),
        real( 0.78214099767712919054), real( 0.78373309869384710780), real( 0.78532667508897469055), real( 0.78692172917844338542), real( 0.78851826328318663784), real( 0.79011627972915199347),
        real( 0.79171578084731675240), real( 0.79331676897369940438), real( 0.79491924644937528299), real( 0.79652321562049099857), real( 0.79812867883827520732), real( 0.79973563845905704106),
        real( 0.80134409684427709841), real( 0.80295405636050354303), real( 0.80456551937944342789), real( 0.80617848827796145805), real( 0.80779296543808909448), real( 0.80940895324704420499),
        real( 0.81102645409723994607), real( 0.81264547038630441378), real( 0.81426600451709008066), real( 0.81588805889769477897), real( 0.81751163594146869507), real( 0.81913673806703424241),
        real( 0.82076336769830049445), real( 0.82239152726447439790), real( 0.82402121920008009059), real( 0.82565244594497011477), real( 0.82728520994434306957), real( 0.82891951364875482433),
        real( 0.83055535951413894669), real( 0.83219275000181647250), real( 0.83383168757851455766), real( 0.83547217471637946762), real( 0.83711421389299323081), real( 0.83875780759138773846),
        real( 0.84040295830006173095), real( 0.84204966851299400954), real( 0.84369794072965931253), real( 0.84534777745504530166), real( 0.84699918119966832730), real( 0.84865215447958564088),
        real( 0.85030669981641360256), real( 0.85196281973734433457), real( 0.85362051677515926595), real( 0.85527979346824545281), real( 0.85694065236061167656), real( 0.85860309600190509727),
        real( 0.86026712694742579757), real( 0.86193274775814410216), real( 0.86359996100071600988), real( 0.86526876924749884790), real( 0.86693917507656881316), real( 0.86861118107173584946),
        real( 0.87028478982256041174), real( 0.87196000392436967541), real( 0.87363682597827507781), real( 0.87531525859118719524), real( 0.87699530437583372855), real( 0.87867696595077326993),
        real( 0.88036024594041695224), real( 0.88204514697504066145), real( 0.88373167169080180106), real( 0.88541982272976116342), real( 0.88710960273989336589), real( 0.88880101437510805606),
        real( 0.89049406029526534390), real( 0.89218874316619223297), real( 0.89388506565970304862), real( 0.89558303045361153938), real( 0.89728264023175230424), real( 0.89898389768399511457),
        real( 0.90068680550626678549), real( 0.90239136640056161198), real( 0.90409758307496501661), real( 0.90580545824366898167), real( 0.90751499462698925758), real( 0.90922619495138290446),
        real( 0.91093906194946694388), real( 0.91265359836003590033), real( 0.91436980692807934279), real( 0.91608769040479920420), real( 0.91780725154762921036), real( 0.91952849312025219941),
        real( 0.92125141789261921765), real( 0.92297602864096517372), real( 0.92470232814782871156), real( 0.92643031920207286056), real( 0.92816000459889869134), real( 0.92989138713986663198),
        real( 0.93162446963291623003), real( 0.93335925489238014130), real( 0.93509574573900910988), real( 0.93683394499998473570), real( 0.93857385550894123494), real( 0.94031548010598497989),
        real( 0.94205882163771148541), real( 0.94380388295722517089), real( 0.94555066692415890017), real( 0.94729917640469241125), real( 0.94904941427157230027), real( 0.95080138340413056230),
        real( 0.95255508668830302099), real( 0.95431052701665253224), real( 0.95606770728838386120), real( 0.95782663040936577570), real( 0.95958729929214958698), real( 0.96134971685598991087),
        real( 0.96311388602686520688), real( 0.96487980973749309932), real( 0.96664749092735657854), real( 0.96841693254271965507), real( 0.97018813753664956412), real( 0.97196110886903408499),
        real( 0.97373584950660518889), real( 0.97551236242295791268), real( 0.97729065059857078701), real( 0.97907071702082515419), real( 0.98085256468402737262), real( 0.98263619658942857882),
        real( 0.98442161574524555956), real( 0.98620882516668029183), real( 0.98799782787594292444), real( 0.98978862690227298327), real( 0.99158122528195624668), real( 0.99337562605834939244),
        real( 0.99517183228190109201), real( 0.99696984701017066222), real( 0.99876967330785348942), real( 1.00057131424679823795), real( 1.00237477290602927660), real( 1.00418005237177054845),
        real( 1.00598715573746466667), real( 1.00779608610379578515), real( 1.00960684657871069270), real( 1.01141944027744123957), real( 1.01323387032252654194), real( 1.01505013984383274384),
        real( 1.01686825197857810821), real( 1.01868820987135455525), real( 1.02051001667414764640), real( 1.02233367554636100927), real( 1.02415918965483965231), real( 1.02598656217388883860),
        real( 1.02781579628530006509), real( 1.02964689517837371113), real( 1.03147986204993902248), real( 1.03331470010437898033), real( 1.03515141255365317186), real( 1.03699000261732110495),
        real( 1.03883047352256308038), real( 1.04067282850420639306), real( 1.04251707080474775857), real( 1.04436320367437573964), real( 1.04621123037099139630), real( 1.04806115416024137055),
        real( 1.04991297831553032083), real( 1.05176670611805089806), real( 1.05362234085680683826), real( 1.05547988582863627727), real( 1.05733934433823395516), real( 1.05920071969818052615),
        real( 1.06106401522895987810), real( 1.06292923425898844236), real( 1.06479638012463828645), real( 1.06666545617025976256), real( 1.06853646574820948523), real( 1.07040941221887120349),
        real( 1.07228429895068444466), real( 1.07416112932016583059), real( 1.07603990671193461282), real( 1.07792063451874042812), real( 1.07980331614148683528), real( 1.08168795498925396359),
        real( 1.08357455447932760073), real( 1.08546311803722406175), real( 1.08735364909671283762), real( 1.08924615109984546102), real( 1.09114062749697948718), real( 1.09303708174680447307),
        real( 1.09493551731636973301), real( 1.09683593768110698718), real( 1.09873834632485789520), real( 1.10064274673990292186), real( 1.10254914242698398574), real( 1.10445753689533199271),
        real( 1.10636793366269392536), real( 1.10828033625536037654), real( 1.11019474820818997429), real( 1.11211117306463624921), real( 1.11402961437677849865), real( 1.11595007570534332508),
        real( 1.11787256061973683252), real( 1.11979707269806727510), real( 1.12172361552717569921), real( 1.12365219270266325502), real( 1.12558280782891695360), real( 1.12751546451913831071),
        real( 1.12945016639537065828), real( 1.13138691708852978657), real( 1.13332572023842725883), real( 1.13526657949380238577), real( 1.13720949851234709449), real( 1.13915448096074056750),
        real( 1.14110153051466922669), real( 1.14305065085886092824), real( 1.14500184568711249611), real( 1.14695511870231836582), real( 1.14891047361649878411), real( 1.15086791415083089518),
        real( 1.15282744403567383173), real( 1.15478906701060268780), real( 1.15675278682443627432), real( 1.15871860723526420855), real( 1.16068653201047888857), real( 1.16265656492680702350),
        real( 1.16462870977033494668), real( 1.16660297033654170029), real( 1.16857935043032723499), real( 1.17055785386604593867), real( 1.17253848446753461410), real( 1.17452124606814001240),
        real( 1.17650614251075569250), real( 1.17849317764784888851), real( 1.18048235534149137393), real( 1.18247367946339143607), real( 1.18446715389492296389), real( 1.18646278252716164126),
        real( 1.18846056926091003803), real( 1.19046051800673224896), real( 1.19246263268498564614), real( 1.19446691722585263129), real( 1.19647337556937016778), real( 1.19848201166546597385),
        real( 1.20049282947398627819), real( 1.20250583296472890460), real( 1.20452102611747990935), real( 1.20653841292203911628), real( 1.20855799737825941875), real( 1.21057978349607542334),
        real( 1.21260377529553631248), real( 1.21462997680684181567), real( 1.21665839207037151937), real( 1.21868902513672328070), real( 1.22072188006674031691), real( 1.22275696093154939703),
        real( 1.22479427181259370450), real( 1.22683381680166547767), real( 1.22887560000094109292), real( 1.23091962552301348310), real( 1.23296589749092966315), real( 1.23501442003822203830),
        real( 1.23706519730894481945), real( 1.23911823345770644167), real( 1.24117353264970664561), real( 1.24323109906077267084), real( 1.24529093687738967589), real( 1.24735305029674048427),
        real( 1.24941744352673778096), real( 1.25148412078606319220), real( 1.25355308630420037019), real( 1.25562434432147052021), real( 1.25769789908907014819), real( 1.25977375486910547764),
        real( 1.26185191593463241766), real( 1.26393238656968720512), real( 1.26601517106932770496), real( 1.26810027373966871522), real( 1.27018769889791904859), real( 1.27227745087241728150),
        real( 1.27436953400267061198), real( 1.27646395263939238518), real( 1.27856071114453828663), real( 1.28065981389134453394), real( 1.28276126526436629049), real( 1.28486506965951585713),
        real( 1.28697123148410019766), real( 1.28907975515685890855), real( 1.29119064510800329870), real( 1.29330390577925524731), real( 1.29541954162388583960), real( 1.29753755710675466872),
        real( 1.29965795670434824949), real( 1.30178074490481932024), real( 1.30390592620802880930), real( 1.30603350512558091800), real( 1.30816348618086686351), real( 1.31029587390910351452),
        real( 1.31243067285737446959), real( 1.31456788758466758260), real( 1.31670752266191848356), real( 1.31884958267205099069), real( 1.32099407221001685642), real( 1.32314099588283617948),
        real( 1.32529035830964025955), real( 1.32744216412171378572), real( 1.32959641796253236201), real( 1.33175312448780980290), real( 1.33391228836553499271), real( 1.33607391427601673861),
        real( 1.33823800691192706935), real( 1.34040457097834031508), real( 1.34257361119277729422), real( 1.34474513228525038855), real( 1.34691913899830462142), real( 1.34909563608705962423),
        real( 1.35127462831925448938), real( 1.35345612047529195721), real( 1.35564011734828304689), real( 1.35782662374408613637), real( 1.36001564448135692231), real( 1.36220718439158972046),
        real( 1.36440124831916342885), real( 1.36659784112138460443), real( 1.36879696766853231615), real( 1.37099863284390788287), real( 1.37320284154387461939), real( 1.37540959867790446580),
        real( 1.37761890916862483891), real( 1.37983077795186726000), real( 1.38204520997670776694), real( 1.38426221020551798446), real( 1.38648178361400842284), real( 1.38870393519127754978),
        real( 1.39092866993985908586), real( 1.39315599287576596943), real( 1.39538590902854053866), real( 1.39761842344130271520), real( 1.39985354117079530134), real( 1.40209126728743282975),
        real( 1.40433160687535085742), real( 1.40657456503245414936), real( 1.40882014687046441814), real( 1.41106835751497050602), real( 1.41331920210547390404), real( 1.41557268579544626164),
        real( 1.41782881375236780030), real( 1.42008759115778682158), real( 1.42234902320736411596), real( 1.42461311511092425519), real( 1.42687987209250866094), real( 1.42914929939042201212),
        real( 1.43142140225728708991), real( 1.43369618596009185119), real( 1.43597365578024560584), real( 1.43825381701362653430), real( 1.44053667497063475622), real( 1.44282223497624628727),
        real( 1.44511050237006166697), real( 1.44740148250636191385), real( 1.44969518075415981784), real( 1.45199160249725256477), real( 1.45429075313427524918), real( 1.45659263807875483110),
        real( 1.45889726275916409293), real( 1.46120463261897381990), real( 1.46351475311671030965), real( 1.46582762972600666451), real( 1.46814326793565674834), real( 1.47046167324967624879),
        real( 1.47278285118735152714), real( 1.47510680728329712785), real( 1.47743354708751106763), real( 1.47976307616543456547), real( 1.48209540009800111449), real( 1.48443052448170065283),
        real( 1.48676845492863063392), real( 1.48910919706655575645), real( 1.49145275653896458579), real( 1.49379913900512883984), real( 1.49614835014015645775), real( 1.49850039563505532669),
        real( 1.50085528119678834891), real( 1.50321301254833294969), real( 1.50557359542873991920), real( 1.50793703559319203222), real( 1.51030333881306622068), real( 1.51267251087598797454),
        real( 1.51504455758589706704), real( 1.51741948476310328786), real( 1.51979729824435194629), real( 1.52217800388287938240), real( 1.52456160754847691585), real( 1.52694811512755301841),
        real( 1.52933753252319304394), real( 1.53172986565522317726), real( 1.53412512046027016410), real( 1.53652330289182637024), real( 1.53892441892031262007), real( 1.54132847453313992503),
        real( 1.54373547573477254424), real( 1.54614542854679481998), real( 1.54855833900797179581), real( 1.55097421317431538590), real( 1.55339305711914943409), real( 1.55581487693317455090),
        real( 1.55823967872453139627), real( 1.56066746861886973541), real( 1.56309825275941016720), real( 1.56553203730701651075), real( 1.56796882844025553538), real( 1.57040863235546801491),
        real( 1.57285145526683489692), real( 1.57529730340644458231), real( 1.57774618302436286932), real( 1.58019810038869734647), real( 1.58265306178566911299), real( 1.58511107351967917012),
        real( 1.58757214191338147380), real( 1.59003627330774666149), real( 1.59250347406213754731), real( 1.59497375055437662361), real( 1.59744710918081489481), real( 1.59992355635640914890),
        real( 1.60240309851478324177), real( 1.60488574210830958755), real( 1.60737149360817377364), real( 1.60986035950445183218), real( 1.61235234630617951801), real( 1.61484746054142824789),
        real( 1.61734570875737304618), real( 1.61984709752037536745), real( 1.62235163341604571308), real( 1.62485932304932978454), real( 1.62737017304457265432), real( 1.62988419004560158854),
        real( 1.63240138071579710122), real( 1.63492175173817200218), real( 1.63744530981544578196), real( 1.63997206167012077316), real( 1.64250201404456031007), real( 1.64503517370106600026),
        real( 1.64757154742195499608), real( 1.65011114200963948662), real( 1.65265396428670241491), real( 1.65520002109597963447), real( 1.65774931930063806895), real( 1.66030186578425498212),
        real( 1.66285766745089724772), real( 1.66541673122520328398), real( 1.66797906405246498807), real( 1.67054467289870722801), real( 1.67311356475076955519), real( 1.67568574661638858281),
        real( 1.67826122552428302903), real( 1.68084000852423254280), real( 1.68342210268716385713), real( 1.68600751510523405585), real( 1.68859625289198289622), real( 1.69118832318214518118),
        real( 1.69378373313214281026), real( 1.69638248991990003844), real( 1.69898460074499668693), real( 1.70159007282875385236), real( 1.70419891341432383491), real( 1.70681112976677384907),
        real( 1.70942672917317461945), real( 1.71204571894268764432), real( 1.71466810640665889842), real( 1.71729389891870032336), real( 1.71992310385478663903), real( 1.72255572861333883239),
        real( 1.72519178061531874846), real( 1.72783126730431724205), real( 1.73047419614665209942), real( 1.73312057463144797431), real( 1.73577041027074074897), real( 1.73842371059956324331),
        real( 1.74108048317604091615), real( 1.74374073558148556806), real( 1.74640447542048726781), real( 1.74907171032101227404), real( 1.75174244793449940261), real( 1.75441669593594840038),
        real( 1.75709446202402408410), real( 1.75977575392114915509), real( 1.76246057937360367518), real( 1.76514894615161899161), real( 1.76784086204947943344), real( 1.77053633488562112142),
        real( 1.77323537250272700305), real( 1.77593798276783210177), real( 1.77864417357242099449), real( 1.78135395283252817578), real( 1.78406732848884108655), real( 1.78678430850680269870),
        real( 1.78950490087670610606), real( 1.79222911361381154194), real( 1.79495695475843830557), real( 1.79768843237607134355), real( 1.80042355455746960757), real( 1.80316232941876708473),
        real( 1.80590476510158293166), real( 1.80865086977312117256), real( 1.81140065162628305373), real( 1.81415411887977340299), real( 1.81691127977820676698), real( 1.81967214259221687911),
        real( 1.82243671561856723784), real( 1.82520500718026013054), real( 1.82797702562664432513), real( 1.83075277933352942306), real( 1.83353227670329554932), real( 1.83631552616500681729),
        real( 1.83910253617452101871), real( 1.84189331521460797347), real( 1.84468787179505788743), real( 1.84748621445279970210), real( 1.85028835175201478158), real( 1.85309429228425415204),
        real( 1.85590404466855085630), real( 1.85871761755154096818), real( 1.86153501960758260836), real( 1.86435625953886718875), real( 1.86718134607554753224), real( 1.87001028797584889496),
        real( 1.87284309402619553175), real( 1.87567977304132949001), real( 1.87852033386442784924), real( 1.88136478536723550370), real( 1.88421313645017640681), real( 1.88706539604248280106),
        real( 1.88992157310232244960), real( 1.89278167661691631984), real( 1.89564571560266914574), real( 1.89851369910529688134), real( 1.90138563619994682696), real( 1.90426153599133307637),
        real( 1.90714140761386308220), real( 1.91002526023176066872), real( 1.91291310303920591984), real( 1.91580494526045708170), real( 1.91870079614998712003), real( 1.92160066499261472650),
        real( 1.92450456110363155027), real( 1.92741249382894719311), real( 1.93032447254521355440), real( 1.93324050665996161058), real( 1.93616060561173997101), real( 1.93908477887025121333),
        real( 1.94201303593648688661), real( 1.94494538634286739942), real( 1.94788183965337791115), real( 1.95082240546371421530), real( 1.95376709340141441196), real( 1.95671591312600878787),
        real( 1.95966887432915592981), real( 1.96262598673478994016), real( 1.96558726009925699429), real( 1.96855270421147010573), real( 1.97152232889304190877), real( 1.97449614399844408652),
        real( 1.97747415941514548265), real( 1.98045638506375931698), real( 1.98344283089819795052), real( 1.98643350690581921292), real( 1.98942842310757228574), real( 1.99242758955815979505),
        real( 1.99543101634617570106), real( 1.99843871359427005530), real( 2.00145069145929799248), real( 2.00446696013247382950), real( 2.00748752983952760687), real( 2.01051241084086251831),
        real( 2.01354161343171034204), real( 2.01657514794229086874), real( 2.01961302473797044144), real( 2.02265525421942360396), real( 2.02570184682279386124), real( 2.02875281301985266325),
        real( 2.03180816331816460618), real( 2.03486790826125441001), real( 2.03793205842876590239), real( 2.04100062443663254896), real( 2.04407361693723954588), real( 2.04715104661959790278),
        real( 2.05023292420950875581), real( 2.05331926046973078925), real( 2.05641006620015964756), real( 2.05950535223798958384), real( 2.06260512945789420414), real( 2.06570940877219566545),
        real( 2.06881820113103964687), real( 2.07193151752257520570), real( 2.07504936897312708410), real( 2.07817176654737467700), real( 2.08129872134853322052), real( 2.08443024451853364809),
        real( 2.08756634723820067023), real( 2.09070704072743618340), real( 2.09385233624540445518), real( 2.09700224509071686541), real( 2.10015677860161487089), real( 2.10331594815615430250),
        real( 2.10647976517240298477), real( 2.10964824110861925988), real( 2.11282138746344694269), real( 2.11599921577610450285), real( 2.11918173762658046400), real( 2.12236896463582302985),
        real( 2.12556090846593903620), real( 2.12875758082038357699), real( 2.13195899344416428534), real( 2.13516515812403540053), real( 2.13837608668869805228), real( 2.14159179100899965675),
        real( 2.14481228299813775351), real( 2.14803757461186295430), real( 2.15126767784868366817), real( 2.15450260475006682981), real( 2.15774236740065328277), real( 2.16098697792845850785),
        real( 2.16423644850508711812), real( 2.16749079134594024865), real( 2.17075001871043049562), real( 2.17401414290218797376), real( 2.17728317626928946638), real( 2.18055713120445870956),
        real( 2.18383602014529198954), real( 2.18711985557447796680), real( 2.19040865002001128303), real( 2.19370241605542126706), real( 2.19700116629998953854), real( 2.20030491341897560531),
        real( 2.20361367012384556929), real( 2.20692744917249239478), real( 2.21024626336946949934), real( 2.21357012556622301247), real( 2.21689904866131426431), real( 2.22023304560066092606),
        real( 2.22357212937776749229), real( 2.22691631303396109232), real( 2.23026560965863085428), real( 2.23362003238946238426), real( 2.23697959441267979486), real( 2.24034430896329395111),
        real( 2.24371418932533428503), real( 2.24708924883210192647), real( 2.25046950086641128763), real( 2.25385495886084408212), real( 2.25724563629798913311), real( 2.26064154671070616232),
        real( 2.26404270368236559818), real( 2.26744912084711414124), real( 2.27086081189012256587), real( 2.27427779054784862112), real( 2.27770007060828927337), real( 2.28112766591125515347),
        real( 2.28456059034861569401), real( 2.28799885786457934955), real( 2.29144248245594939206), real( 2.29489147817239480531), real( 2.29834585911672251157), real( 2.30180563944514782193),
        real( 2.30527083336755866938), real( 2.30874145514780471089), real( 2.31221751910396688956), real( 2.31569903960862966130), real( 2.31918603108917498190), real( 2.32267850802805542187),
        real( 2.32617648496307571904), real( 2.32967997648768898600), real( 2.33318899725127115730), real( 2.33670356195942297006), real( 2.34022368537425595747), real( 2.34374938231468199490),
        real( 2.34728066765671705696), real( 2.35081755633377209591), real( 2.35436006333695457826), real( 2.35790820371537179767), real( 2.36146199257642930291), real( 2.36502144508613909579),
        real( 2.36858657646943226993), real( 2.37215740201045743873), real( 2.37573393705289870326), real( 2.37931619700029139963), real( 2.38290419731633429379), real( 2.38649795352520843750),
        real( 2.39009748121189335990), real( 2.39370279602249658168), real( 2.39731391366457513570), real( 2.40093084990745442298), real( 2.40455362058257060554), real( 2.40818224158379212696),
        real( 2.41181672886775544384), real( 2.41545709845419676043), real( 2.41910336642629797410), real( 2.42275554893102063048), real( 2.42641366217945053663), real( 2.43007772244713793341),
        real( 2.43374774607445276686), real( 2.43742374946692619275), real( 2.44110574909560940071), real( 2.44479376149742133606), real( 2.44848780327551152070), real( 2.45218789109961132766),
        real( 2.45589404170640834835), real( 2.45960627189989367025), real( 2.46332459855174334962), real( 2.46704903860168034413), real( 2.47077960905784976831), real( 2.47451632699718837571),
        real( 2.47825920956580691978), real( 2.48200827397936496510), real( 2.48576353752345946546), real( 2.48952501755400312788), real( 2.49329273149761299067), real( 2.49706669685200877140),
        real( 2.50084693118639389553), real( 2.50463345214186361432), real( 2.50842627743178825384), real( 2.51222542484223199111), real( 2.51603091223234720530), real( 2.51984275753478170756),
        real( 2.52366097875609307621), real( 2.52748559397715721886), real( 2.53131662135358759258), real( 2.53515407911615486825), real( 2.53899798557120170983), real( 2.54284835910107664958),
        real( 2.54670521816455952546), real( 2.55056858129728691864), real( 2.55443846711219579859), real( 2.55831489429994762830), real( 2.56219788162938755249), real( 2.56608744794796805877),
        real( 2.56998361218220816582), real( 2.57388639333814017718), real( 2.57779581050176354040), real( 2.58171188283949604170), real( 2.58563462959864320823), real( 2.58956407010785571998),
        real( 2.59350022377759303893), real( 2.59744311010060346945), real( 2.60139274865238379064), real( 2.60534915909166908676), real( 2.60931236116090659038), real( 2.61328237468673663102),
        real( 2.61725921958048779459), real( 2.62124291583866453337), real( 2.62523348354343832867), real( 2.62923094286315439660), real( 2.63323531405282107443), real( 2.63724661745462629625),
        real( 2.64126487349844829566), real( 2.64529010270235609426), real( 2.64932232567313885596), real( 2.65336156310682413917), real( 2.65740783578919748109), real( 2.66146116459633841345),
        real( 2.66552157049514715226), real( 2.66958907454388283398), real( 2.67366369789270974522), real( 2.67774546178423156206), real( 2.68183438755405090248), real( 2.68593049663131644422),
        real( 2.69003381053927759226), real( 2.69414435089585690974), real( 2.69826213941420212095), real( 2.70238719790326475945), real( 2.70651954826837437551), real( 2.71065921251181141116),
        real( 2.71480621273339517430), real( 2.71896057113107092462), real( 2.72312231000150317684), real( 2.72729145174066722745), real( 2.73146801884445133979), real( 2.73565203390926914295),
        real( 2.73984351963266714591), real( 2.74404249881393091925), real( 2.74824899435471792231), real( 2.75246302925967478714), real( 2.75668462663707236615), real( 2.76091380969942834511),
        real( 2.76515060176416405113), real( 2.76939502625423283888), real( 2.77364710669878045124), real( 2.77790686673379205729), real( 2.78217433010275749794), real( 2.78644952065733164659),
        real( 2.79073246235800498383), real( 2.79502317927478438619), real( 2.79932169558786370089), real( 2.80362803558832052175), real( 2.80794222367879786617), real( 2.81226428437420539197),
        real( 2.81659424230242594334), real( 2.82093212220501321497), real( 2.82527794893791339703), real( 2.82963174747218548788), real( 2.83399354289471316903), real( 2.83836336040895398369),
        real( 2.84274122533566631077), real( 2.84712716311364433253), real( 2.85152119930048320029), real( 2.85592335957331844298), real( 2.86033366972959868235), real( 2.86475215568784014053),
        real( 2.86917884348841001341), real( 2.87361375929429696541), real( 2.87805692939190782553), real( 2.88250838019184163485), real( 2.88696813822970810293), real( 2.89143623016691675431),
        real( 2.89591268279149449683), real( 2.90039752301890763064), real( 2.90489077789287541975), real( 2.90939247458621164100), real( 2.91390264040166035997), real( 2.91842130277273215100),
        real( 2.92294848926457229155), real( 2.92748422757480764034), real( 2.93202854553441438767), real( 2.93658147110859735207), real( 2.94114303239766128328), real( 2.94571325763790881069),
        real( 2.95029217520252906581), real( 2.95487981360249962748), real( 2.95947620148750401015), real( 2.96408136764684249087), real( 2.96869534101035981166), real( 2.97331815064938309590),
        real( 2.97794982577765132703), real( 2.98259039575227813401), real( 2.98723989007470258628), real( 2.99189833839165064688), real( 2.99656577049611794195), real( 3.00124221632834009554),
        real( 3.00592770597679725952), real( 3.01062226967919777110), real( 3.01532593782349112033), real( 3.02003874094888624668), real( 3.02476070974687427650), real( 3.02949187506225703359),
        real( 3.03423226789419508975), real( 3.03898191939725492716), real( 3.04374086088246986748), real( 3.04850912381841077092), real( 3.05328673983225806765), real( 3.05807374071089954626),
        real( 3.06287015840201615191), real( 3.06767602501519798253), real( 3.07249137282305317953), real( 3.07731623426234079943), real( 3.08215064193510146495), real( 3.08699462860980133883),
        real( 3.09184822722249741389), real( 3.09671147087798726005), real( 3.10158439285100540062), real( 3.10646702658739348735), real( 3.11135940570529934135), real( 3.11626156399639864247),
        real( 3.12117353542709041747), real( 3.12609535413975070384), real( 3.13102705445412121676), real( 3.13596867086789288237), real( 3.14092023805898090671), real( 3.14588179088611896717),
        real( 3.15085336439032426270), real( 3.15583499379618093172), real( 3.16082671451315633249), real( 3.16582856213691599123), real( 3.17084057245065764619), real( 3.17586278142645372924),
        real( 3.18089522522660939075), real( 3.18593794020502762976), real( 3.19099096290859396419), real( 3.19605433007856287730), real( 3.20112807865197135371), real( 3.20621224576305419163),
        real( 3.21130686874467086156), real( 3.21641198512975989843), real( 3.22152763265279240557), real( 3.22665384925123666093), real( 3.23179067306705869456), real( 3.23693814244820110559),
        real( 3.24209629595011827874), real( 3.24726517233728495526), real( 3.25244481058474033119), real( 3.25763524987964947499), real( 3.26283652962287629151), real( 3.26804868943054582786),
        real( 3.27327176913567363670), real( 3.27850580878975605970), real( 3.28375084866441113718), real( 3.28900692925302440273), real( 3.29427409127239378961), real( 3.29955237566442827202),
        real( 3.30484182359782163729), real( 3.31014247646976667028), real( 3.31545437590768221625), real( 3.32077756377094335249), real( 3.32611208215264797516), real( 3.33145797338139271204),
        real( 3.33681528002304528258), real( 3.34218404488257458951), real( 3.34756431100586615557), real( 3.35295612168155754418), real( 3.35835952044291197183), real( 3.36377455106969014409),
        real( 3.36920125759004607247), real( 3.37463968428244420750), real( 3.38008987567759300319), real( 3.38555187656039358046), real( 3.39102573197191992094), real( 3.39651148721139906073),
        real( 3.40200918783822725544), real( 3.40751887967400080015), real( 3.41304060880456638927), real( 3.41857442158208479910), real( 3.42412036462712610074), real( 3.42967848483078174837),
        real( 3.43524882935679753970), real( 3.44083144564372123142), real( 3.44642638140708479355), real( 3.45203368464159510154), real( 3.45765340362335171775), real( 3.46328558691210020015),
        real( 3.46893028335347120006), real( 3.47458754208128750562), real( 3.48025741251987108527), real( 3.48593994438635634836), real( 3.49163518769307090750), real( 3.49734319274989458037),
        real( 3.50306401016668012005), real( 3.50879769085566639575), real( 3.51454428603394042341), real( 3.52030384722591138669), real( 3.52607642626582196144), real( 3.53186207530025919610),
        real( 3.53766084679073067321), real( 3.54347279351623090093), real( 3.54929796857585522218), real( 3.55513642539143770449), real( 3.56098821771020102034), real( 3.56685339960746361498),
        real( 3.57273202548934509792), real( 3.57862415009550982603), real( 3.58452982850195622788), real( 3.59044911612380612809), real( 3.59638206871814736232), real( 3.60232874238689149138),
        real( 3.60828919357966704240), real( 3.61426347909674694492), real( 3.62025165609200128003), real( 3.62625378207587756307), real( 3.63226991491843120841), real( 3.63830011285236798457),
        real( 3.64434443447611622346), real( 3.65040293875696741921), real( 3.65647568503419373442), real( 3.66256273302225565658), real( 3.66866414281401143072), real( 3.67477997488395580206),
        real( 3.68091029009152670426), real( 3.68705514968441772083), real( 3.69321461530192740597), real( 3.69938874897837433053), real( 3.70557761314650413453), real( 3.71178127064098584142),
        real( 3.71799978470189396162), real( 3.72423321897827097615), real( 3.73048163753170314294), real( 3.73674510483994826160), real( 3.74302368580059985348), real( 3.74931744573479086569),
        real( 3.75562645039093601085), real( 3.76195076594852650942), real( 3.76829045902195414186), real( 3.77464559666438592700), real( 3.78101624637167565979), real( 3.78740247608633318066),
        real( 3.79380435420151718162), real( 3.80022194956509329344), real( 3.80665533148371615368), real( 3.81310456972698919031), real( 3.81956973453163994847), real( 3.82605089660575981014),
        real( 3.83254812713308412597), real( 3.83906149777733363138), real( 3.84559108068658739299), real( 3.85213694849772592121), real( 3.85869917434089959585), real( 3.86527783184408413319),
        real( 3.87187299513765292858), real( 3.87848473885902311764), real( 3.88511313815735759292), real( 3.89175826869829455390), real( 3.89842020666877830948), real( 3.90509902878190295894),
        real( 3.91179481228182890362), real( 3.91850763494877307735), real( 3.92523757510403115134), real( 3.93198471161507256966), real( 3.93874912390069331636), real( 3.94553089193624151321),
        real( 3.95233009625888209726), real( 3.95914681797294232268), real( 3.96598113875530611239), real( 3.97283314086089944794), real( 3.97970290712820817802), real( 3.98659052098488020377),
        real( 3.99349606645340671207), real( 4.00041962815684026822), real( 4.00736129132460661140), real( 4.01432114179839061308), real( 4.02129926603806175933), real( 4.02829575112771909318),
        real( 4.03531068478176901948), real( 4.04234415535109192774), real( 4.04939625182929852087), real( 4.05646706385904209924), real( 4.06355668173841522162), real( 4.07066519642743696039),
        real( 4.07779269955459788832), real( 4.08493928342351875216), real( 4.09210504101965355517), real( 4.09929006601710543833), real( 4.10649445278552338578), real( 4.11371829639707264903),
        real( 4.12096169263350642353), real( 4.12822473799332367861), real( 4.13550752969899626521), real( 4.14281016570433990864), real( 4.15013274470192161658), real( 4.15747536613058876753),
        real( 4.16483813018310211618), real( 4.17222113781384162934), real( 4.17962449074664554871), real( 4.18704829148270540884), real( 4.19449264330861115724), real( 4.20195765030446910515),
        real( 4.20944341735212290700), real( 4.21695005014351220751), real( 4.22447765518911033666), real( 4.23202633982647657973), real( 4.23959621222894611492), real( 4.24718738141438834077),
        real( 4.25479995725413040475), real( 4.26243405048196422058), real( 4.27008977270328671239), real( 4.27776723640435818652), real( 4.28546655496168504840), real( 4.29318784265153485791),
        real( 4.30093121465955530169), real( 4.30869678709056280752), real( 4.31648467697841020652), real( 4.32429500229604268924), real( 4.33212788196564790866), real( 4.33998343586897039614),
        real( 4.34786178485774943425), real( 4.35576305076430525531), real( 4.36368735641227267763), real( 4.37163482562748839655), real( 4.37960558324899373872), real( 4.38759975514025857279),
        real( 4.39561746820047982709), real( 4.40365885037608428831), real( 4.41172403067239393692), real( 4.41981313916543250286), real( 4.42792630701390610426), real( 4.43606366647135619274),
        real( 4.44422535089847237089), real( 4.45241149477560327341), real( 4.46062223371541310968), real( 4.46885770447573182906), real( 4.47711804497260246194), real( 4.48540339429348922096),
        real( 4.49371389271069521243), real( 4.50204968169495689523), real( 4.51041090392923660346), real( 4.51879770332274599554), real( 4.52721022502511694086), real( 4.53564861544081665556),
        real( 4.54411302224376800751), real( 4.55260359439217765498), real( 4.56112048214357823639), real( 4.56966383707009793369), real( 4.57823381207395385672), real( 4.58683056140317457761),
        real( 4.59545424066755003878), real( 4.60410500685483370376), real( 4.61278301834715342977), real( 4.62148843493772520929), real( 4.63022141784774898809), real( 4.63898212974361268124),
        real( 4.64777073475432533911), real( 4.65658739848923186599), real( 4.66543228805598975129), real( 4.67430557207879804338), real( 4.68320742071696294317), real( 4.69213800568368455401),
        real( 4.70109750026515360588), real( 4.71008607933997680561), real( 4.71910391939883577805), real( 4.72815119856451904212), real( 4.73722809661222488131), real( 4.74633479499018040570),
        real( 4.75547147684061144446), real( 4.76463832702101353078), real( 4.77383553212577638192), real( 4.78306328050813434061), real( 4.79232176230247919335), real( 4.80161116944702470732),
        real( 4.81093169570682110958), real( 4.82028353669715770025), real( 4.82966688990732073705), real( 4.83908195472475188836), real( 4.84852893245958771473), real( 4.85800802636959261349),
        real( 4.86751944168550743086), real( 4.87706338563680663611), real( 4.88664006747789070317), real( 4.89624969851466396165), real( 4.90589249213162137409), real( 4.91556866381931722998),
        real( 4.92527843120233121965), real( 4.93502201406767326830), real( 4.94479963439368663813), real( 4.95461151637941821235), real( 4.96445788647449681719), real( 4.97433897340948050214),
        real( 4.98425500822712841398), real( 4.99420622431243099726), real( 5.00419285742655617355), real( 5.01421514573804305570), real( 5.02427332985616992289), real( 5.03436765286457532653),
        real( 5.04449836035546450574), real( 5.05466570046439755970), real( 5.06486992390568779854), real( 5.07511128400842626007), real( 5.08539003675312173414), real( 5.09570644080900514439),
        real( 5.10606075757196276044), real( 5.11645325120317640000), real( 5.12688418866842265942), real( 5.13735383977808002243), real( 5.14786247722786516334), real( 5.15841037664027535214),
        real( 5.16899781660681068018), real( 5.17962507873092992128), real( 5.19029244767178088438), real( 5.20100021118878785842), real( 5.21174866018697358072), real( 5.22253808876316139020),
        real( 5.23336879425302026192), real( 5.24424107727897936826), real( 5.25515524179902726587), real( 5.26611159515641080731), real( 5.27711044813029506173), real( 5.28815211498732651307),
        real( 5.29923691353423365058), real( 5.31036516517133794224), real( 5.32153719494715371496), real( 5.33275333161399345272), real( 5.34401390768464690240), real( 5.35531925949012599375),
        real( 5.36666972723856972038), real( 5.37806565507522638114), real( 5.38950739114366861315), real( 5.40099528764813374693), real( 5.41252970091715024381), real( 5.42411099146835518070),
        real( 5.43573952407462890335), real( 5.44741566783153796649), real( 5.45913979622607570263), real( 5.47091228720685585074), real( 5.48273352325562246534), real( 5.49460389146026528806),
        real( 5.50652378358929173174), real( 5.51849359616777590531), real( 5.53051373055492057063), real( 5.54258459302314321349), real( 5.55470659483881945562), real( 5.56688015234468558390),
        real( 5.57910568704394727035), real( 5.59138362568612645731), real( 5.60371440035472190289), real( 5.61609844855668871588), real( 5.62853621331380171711), real( 5.64102814325598522771),
        real( 5.65357469271655066478), real( 5.66617632182956043607), real( 5.67883349662919112433), real( 5.69154668915129668960), real( 5.70431637753711662242), real( 5.71714304613927737364),
        real( 5.73002718563007196195), real( 5.74296929311211989955), real( 5.75596987223145539758), real( 5.76902943329312645204), real( 5.78214849337934833073), real( 5.79532757647027629844),
        real( 5.80856721356750060892), real( 5.82186794282030728453), real( 5.83523030965478284315), real( 5.84865486690587310648), real( 5.86214217495239608979), real( 5.87569280185523368232),
        real( 5.88930732349859198393), real( 5.90298632373460652190), real( 5.91673039453128879472), real( 5.93054013612387542764), real( 5.94441615716977889150), real( 5.95835907490715754875),
        real( 5.97236951531722404241), real( 5.98644811329044035375), real( 6.00059551279666081314), real( 6.01481236705933852704), real( 6.02909933873397196891), real( 6.04345710009082903724),
        real( 6.05788633320215819111), real( 6.07238773013393817735), real( 6.08696199314236352507), real( 6.10160983487517150081), real( 6.11633197857799082442), real( 6.13112915830578408816),
        real( 6.14600211913963256904), real( 6.16095161740898245029), real( 6.17597842091949011945), real( 6.19108330918669302889), real( 6.20626707367562779893), real( 6.22153051804663803637),
        real( 6.23687445840752641146), real( 6.25229972357224639268), real( 6.26780715532634058462), real( 6.28339760869937791199), real( 6.29907195224456017968), real( 6.31483106832574137002),
        real( 6.33067585341209149163), real( 6.34660721838071228973), real( 6.36262608882734514992), real( 6.37873340538552291434), real( 6.39493012405445426793), real( 6.41121721653583520606),
        real( 6.42759567057996861195), real( 6.44406649034148060196), real( 6.46063069674491430305), real( 6.47728932786060429549), real( 6.49404343929110883238), real( 6.51089410456859418730),
        real( 6.52784241556356636949), real( 6.54488948290526906248), real( 6.56203643641425404809), real( 6.57928442554743675430), real( 6.59663461985615118266), real( 6.61408820945765274502),
        real( 6.63164640552050776989), real( 6.64931044076437771650), real( 6.66708156997477985328), real( 6.68496107053322052849), real( 6.70295024296342489833), real( 6.72105041149411697177),
        real( 6.73926292463901877028), real( 6.75758915579475871738), real( 6.77603050385718308490), real( 6.79458839385693913471), real( 6.81326427761498543134), real( 6.83205963441876384934),
        real( 6.85097597171982108932), real( 6.87001482585375278234), real( 6.88917776278325355577), real( 6.90846637886530423600), real( 6.92788230164322449411), real( 6.94742719066478287004),
        real( 6.96710273832730120347), real( 6.98691067075079352833), real( 7.00685274868035357088), real( 7.02693076841950770017), real( 7.04714656279224715973), real( 7.06750200214369073137),
        real( 7.08799899536949240542), real( 7.10863949098357927880), real( 7.12942547822262895352), real( 7.15035898818925641507), real( 7.17144209503560237096), real( 7.19267691718904611520),
        real( 7.21406561862185391476), real( 7.23561041016666450787), real( 7.25731355087982965557), real( 7.27917734945464367513), real( 7.30120416568678631819), real( 7.32339641199420743334),
        real( 7.34575655499392965453), real( 7.36828711713840167619), real( 7.39099067841402046497), real( 7.41386987810476849603), real( 7.43692741662392275970), real( 7.46016605741705252086),
        real( 7.48358862893964893459), real( 7.50719802671291791540), real( 7.53099721546150657758), real( 7.55498923133700017729), real( 7.57917718423155672980), real( 7.60356426018592035376),
        real( 7.62815372389651358276), real( 7.65294892132660642403), real( 7.67795328242672781016), real( 7.70317032396982792619), real( 7.72860365250718928110), real( 7.75425696745108261609),
        real( 7.78013406429095777384), real( 7.80623883795005824027), real( 7.83257528628995469688), real( 7.85914751377071141292), real( 7.88595973527538784964), real( 7.91301628010742330588),
        real( 7.94032159617066835011), real( 7.96788025434200442021), real( 7.99569695304735805763), real( 8.02377652305256638954), real( 8.05212393248133651014), real( 8.08074429207322708635),
        real( 8.10964286069573780935), real( 8.13882505112528242819), real( 8.16829643611285050042), real( 8.19806275475163914734), real( 8.22812991916449654184), real( 8.25850402153098350766),
        real( 8.28919134147473890550), real( 8.32019835383366412884), real( 8.35153173683693950125), real( 8.38319838071470790908), real( 8.41520539676817946884), real( 8.44756012693010127634),
        real( 8.48027015384756488459), real( 8.51334331152208356741), real( 8.54678769654394976385), real( 8.58061167996144824599), real( 8.61482391982834982969), real( 8.64943337447664895024),
        real( 8.68444931656567220557), real( 8.71988134796247393865), real( 8.75573941551325241051), real( 8.79203382777094688549), real( 8.82877527274879092545), real( 8.86597483677691045045),
        real( 8.90364402454490999617), real( 8.94179478042104847191), real( 8.98043951114711980210), real( 9.01959111001665725382), real( 9.05926298265447904612), real( 9.09946907452671815975),
        real( 9.14022390032326370601), real( 9.18154257536195395062), real( 9.22344084919855511373), real( 9.26593514161146281083), real( 9.30904258117996796784), real( 9.35278104667783871662),
        real( 9.39716921153345374762), real( 9.44222659163314403941), real( 9.48797359677410589995), real( 9.53443158610627250482), real( 9.58162292794029823995), real( 9.62957106434076415269),
        real( 9.67830058097148615559), real( 9.72783728271395808918), real( 9.77820827564107730723), real( 9.82944205599834752718), real( 9.88156860692341787455), real( 9.93461950372636870554),
        real( 9.98862802865614796133), real(10.04362929619765942846), real(10.09966039008090987750), real(10.15676051334082252708), real(10.21497115294858026857), real(10.27433626074633465919),
        real(10.33490245266148654935), real(10.39671922846267015927), real(10.45983921465308874588), real(10.52431843348680118311), real(10.59021660155431554529), real(10.65759746192499690665),
        real(10.72652915447622490319), real(10.79708462980239325191), real(10.86934211300591712757), real(10.94338562476281140334), real(11.01930556836607344451), real(11.09719939303242064454),
        real(11.17717234567963124903), real(11.25933832572484760703), real(11.34382086031466663201), real(11.43075422096132420791), real(11.52028470689824679596), real(11.61257212596759558210),
        real(11.70779151067831413968), real(11.80613511572527052351), real(11.90781475425083613118), real(12.01306454420966218777), real(12.12214415437619940974), real(12.23534266320630869984),
        real(12.35298317487068153753), real(12.47542837805045223831), real(12.60308728842850101159), real(12.73642349084973801610), real(12.87596530013107454238), real(13.02231840276132324163),
        real(13.17618174386462648329), real(13.33836771350621752674), real(13.50982810881195916863), real(13.69168797606578635850), real(13.88529038936099269108), real(14.09225670183811018887),
        real(14.31456916450145300246), real(14.55468668195886827732), real(14.81571105564389334575), real(15.10163268609384168428), real(15.41770617246162800029), real(15.77104806722107532835),
        real(16.17163588130669182874), real(16.63408240545098593088), real(17.18104240896904499891), real(17.85046924454210071076), real(18.71351249203735989113), real(19.92990569502376985156),
        real(22.00934596389777908598), real(111.68667351342936910896),
    };
}

Spectrum NormalizedDiffusionBSSRDF::eval_r(real distance) const
{
    return A_ * (math::exp(-Spectrum(distance) / d_) +
                 math::exp(-Spectrum(distance) / (real(3) * d_)))
         / (8 * PI_r * d_);
}

SeparableBSSRDF::SampleRResult NormalizedDiffusionBSSRDF::sample_r(
    int channel, Sample1 sam) const
{
    auto r = math::distribution::sample_inv_cdf_table(
        sam.u, INV_CDF_TAB, array_size(INV_CDF_TAB));

    r *= d_[channel];

    SampleRResult ret;
    ret.coef = eval_r(r);
    ret.distance = r;
    ret.pdf = pdf_r(channel, r);

    return ret;
}

real NormalizedDiffusionBSSRDF::pdf_r(int channel, real distance) const
{
    distance /= d_[channel];
    return real(0.25) * (std::exp(-distance) + std::exp(-distance / 3))
         / d_[channel];
}

NormalizedDiffusionBSSRDF::NormalizedDiffusionBSSRDF(
    const EntityIntersection &inct, real eta,
    const Spectrum &A, const Spectrum &dmfp) noexcept
    : SeparableBSSRDF(inct, eta), A_(A), l_(dmfp)
{
    s_ = A.map([](real c)
    {
        const real t = c - real(0.33);
        return real(3.5) + 100 * t * t * t * t;
    });
    d_ = l_ / s_;
}

class NormalizedDiffusionBSSRDFSurface : public BSSRDFSurface
{
    RC<const Texture2D> A_;
    RC<const Texture2D> dmfp_;
    RC<const Texture2D> eta_;

public:

    NormalizedDiffusionBSSRDFSurface(
        RC<const Texture2D> A,
        RC<const Texture2D> dmfp,
        RC<const Texture2D> eta) noexcept
        : A_(std::move(A)), dmfp_(std::move(dmfp)), eta_(std::move(eta))
    {

    }

    BSSRDF *create(const EntityIntersection &inct, Arena &arena) const override
    {
        const Spectrum A    = A_->sample_spectrum(inct.uv);
        const Spectrum dmfp = dmfp_->sample_spectrum(inct.uv);
        const real eta      = eta_->sample_real(inct.uv);
        return arena.create<NormalizedDiffusionBSSRDF>(inct, eta, A, dmfp);
    }
};

RC<BSSRDFSurface> create_normalized_diffusion_bssrdf_surface(
    RC<const Texture2D> A,
    RC<const Texture2D> dmfp,
    RC<const Texture2D> eta)
{
    return newRC<NormalizedDiffusionBSSRDFSurface>(
        std::move(A), std::move(dmfp), std::move(eta));
}

AGZ_TRACER_END
